package com.gzc.just.play.last.war.sceneserver.attribute;

/**
 * 属性值容器 - 用于存储单个属性的基础值和修改值
 *
 * 支持两种数值类型：整数和浮点数
 *
 * @author AI编程助手
 * @version 1.0
 * @since 2025-11-22
 */
public class AttributeValue {
    
    private final AttributeType type;
    private double baseValue;
    private double modificationValue;  // 加成值
    private double percentModification; // 百分比加成
    
    /**
     * 创建属性值
     *
     * @param type 属性类型
     * @param baseValue 基础值
     */
    public AttributeValue(AttributeType type, double baseValue) {
        this.type = type;
        this.baseValue = baseValue;
        this.modificationValue = 0;
        this.percentModification = 0;
    }
    
    /**
     * 获取属性类型
     */
    public AttributeType getType() {
        return type;
    }
    
    /**
     * 获取基础值
     */
    public double getBaseValue() {
        return baseValue;
    }
    
    /**
     * 设置基础值
     */
    public void setBaseValue(double value) {
        this.baseValue = value;
    }
    
    /**
     * 获取修改值（固定值加成）
     */
    public double getModificationValue() {
        return modificationValue;
    }
    
    /**
     * 设置修改值
     */
    public void setModificationValue(double value) {
        this.modificationValue = value;
    }
    
    /**
     * 增加修改值
     */
    public void addModificationValue(double value) {
        this.modificationValue += value;
    }
    
    /**
     * 获取百分比加成
     */
    public double getPercentModification() {
        return percentModification;
    }
    
    /**
     * 设置百分比加成
     */
    public void setPercentModification(double value) {
        // 限制百分比在-100%到100%之间
        this.percentModification = Math.max(-1.0, Math.min(1.0, value));
    }
    
    /**
     * 增加百分比加成
     */
    public void addPercentModification(double value) {
        setPercentModification(percentModification + value);
    }
    
    /**
     * 获取最终属性值 = (基础值 + 固定加成) * (1 + 百分比加成)
     *
     * @return 最终属性值
     */
    public double getFinalValue() {
        double temp = baseValue + modificationValue;
        return temp * (1.0 + percentModification);
    }
    
    /**
     * 获取最终属性值（整数形式，向下取整）
     *
     * @return 最终属性值的整数形式
     */
    public int getFinalValueAsInt() {
        return (int) getFinalValue();
    }
    
    /**
     * 重置所有修改值到0
     */
    public void resetModification() {
        this.modificationValue = 0;
        this.percentModification = 0;
    }
    
    /**
     * 克隆当前属性值
     */
    public AttributeValue clone() {
        AttributeValue cloned = new AttributeValue(type, baseValue);
        cloned.modificationValue = this.modificationValue;
        cloned.percentModification = this.percentModification;
        return cloned;
    }
    
    @Override
    public String toString() {
        return String.format("%s: %.1f (基础: %.1f, 加成: %.1f, 百分比: %.1f%%)",
            type.getDisplayName(),
            getFinalValue(),
            baseValue,
            modificationValue,
            percentModification * 100);
    }
}
